/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package de.hsos.samcomm.forumManagement.controller;

import de.hsos.samcomm.forumManagement.entity.Entry;
import de.hsos.samcomm.forumManagement.entity.Forum;
import de.hsos.samcomm.userManagement.entity.Member;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 * Persitenzklasse fuer die Foren. Verwaltet ebenfalls die Eintraege.
 *
 * @author felix
 */
@Stateless
public class ForumDAO  {

    @PersistenceContext(unitName = "SWA-SamComm-WebPU")
    private EntityManager em;

    /**
     * Fuegt einem Forum den uebergebenen Benutzer hinzu.
     *
     * @param m
     * @param f
     */
    public void addSubscriberToForum(Member m, Forum f) {
        f.addMember(m);
        em.merge(f);
    }

    /**
     * Erstellt ein Forum.
     *
     * @param m
     * @param titel
     * @return neues Forum
     */
    public Forum createForum(Member m, String titel) {
        Forum f = new Forum(titel);
        if (checkForum(f)) {
            f.addMember(m); //Ersteller ist auch gleichzeitig Member
            em.persist(f);
            m.addSubscription(f);
            em.merge(m);
        } else {
            System.err.println("Forum schon vorhanden");
        }
        return f;
    }

    /**
     * Erstellt einen Eintrag in das uebergebene Forum.
     *
     * @param author
     * @param forum
     * @param title
     * @param text
     * @return neuer Eintrag
     */
    public Entry createEntry(Member author, Forum forum, String title, String text) {
        Entry e = new Entry(title, text, author, forum);

        e.setBelongsTo(forum);
        em.persist(e);
        forum.addEntry(e);
        em.merge(forum);
        return e;
    }

    /**
     * Gibt alle Eintraegee mit dem uebergebenen Autor zurueck.
     *
     * @param author
     * @return gefilterte Eintraege
     */
    public List<Entry> findEntriesByAuthor(String author) {
        ArrayList<Entry> tmp = new ArrayList<>();

        for (Forum f : this.getForen()) {
            for (Entry e : f.getEntries()) {
                if (e.getWrittenBy().getNickname().equals(author)) {
                    tmp.add(e);
                }
            }
        }

        return tmp;
    }

    /**
     * Liefert alle Eintraege mit dem uebergebenen Titel.
     *
     * @param title
     * @return gefilterte Eintraege
     */
    public List<Entry> findEntriesByTitle(String title) {
        ArrayList<Entry> tmp = new ArrayList<>();

        for (Forum f : this.getForen()) {
            for (Entry e : f.getEntries()) {
                if (e.getTitle().equals(title)) {
                    tmp.add(e);
                }
            }
        }

        return tmp;
    }

    /**
     * Liefert alle Foren.
     *
     * @return alle Foren
     */
    public List<Forum> getForen() {
        return em.createQuery("SELECT f FROM forum f", Forum.class).getResultList();
    }

    /**
     * Ueberprueft ob der Titel des Forums schon vorhanden ist.
     *
     * @param f
     * @return true, wenn nicht vorhaden.
     */
    private boolean checkForum(Forum f) {
        boolean result = true;
        for (Forum tmp : this.getForen()) {
            result = !(tmp.getTitle().equals(f.getTitle()));
        }
        return result;
    }
}
